//============================================================================================
/**
 * @file	result_tag.c
 * @brief	結果タグ
 *	@author	Nozomu Saito -> Genya Hosaka(引継ぎ)
 */
//============================================================================================
#include "common.h"

#include "result_tag.h"
#include "system/fontproc.h"
#include "system/fontoam.h"
#include "system/arc_util.h"
#include "system/clact_tool.h"
#include "system/wordset.h"
#include "system/msgdata_util.h"

#include "poketool/pokeicon.h"
#include "poketool/poke_tool.h"

#include "../pkthln_clact.h"
#include "../pkthln_act_def.h"
#include "../pkthev_rslt.naix"
#include "../evt_cats.h"
#include "../evt_npcobj.h"

#include "msgdata/msg.naix"
#include "msgdata/msg_pokethlon.h"

//=============================================================================
/**
 *								定数定義
 */
//=============================================================================
enum
{
	TAG_MAX = 5,
	TRAINER_MAX = 4, ///< 改行を使用する場合は5になるが、廃止になったので4で良い
	SUB_DISP_OFS = 300,	///< サブ画面開始オフセット
};

//アクターIDX
enum
{
	ACT_CMN_RANK,
	ACT_CNM_RIBBON,	///< リボンアイコン
	ACT_CMN_TRAINER,
	ACT_CMN_FRAME,
	ACT_CMN_MAX,
};

//アクタープライオリティ
enum{
	TAG_PRI_RANK,
	TAG_PRI_RIBBON,
	TAG_PRI_TRAINER,
	TAG_PRI_FONT,
	TAG_PRI_FRAME,
};

//フォントOAMが使うアクターの数（デバッガで追ったから、数はあってるはず）(4文字で１アクター？)
#define NAME_ACT_NUM	(2)
#define RECORD_ACT_NUM	(5)

//アクター総数
#define ACT_MAX		( (ACT_CMN_MAX + NAME_ACT_NUM + RECORD_ACT_NUM) * TAG_MAX )	///< (基本ACT+フォントOAM(名前+成績))xタグ数

#define TAG_PALETTE_NUM	(6)	//フォント・フレーム4・順位
#define TRAINER_PAL_OFS ( TAG_PALETTE_NUM )

#define FONT_OAM_TYPE_NUM	(2)	//フォントOAMタイプ数(名前、得点)
#define TAG_FONT_OAM_MAX	(FONT_OAM_TYPE_NUM * TAG_MAX)

#define RANK_ANM_OFS	(5)
#define FRAME_PAL_OFS	(2)
#define ICON_DISP_OFS	(4)		//タグ表示の際ポケアイコンは4ドット上に表示

//フォントOAM関連
#define PANEL_MSG_MARGIN	(0)
#define FONTOAM_PAL_NO	(0)
#define FONT_CHR_LEN_NAME	(8)
#define FONT_CHR_LEN_RECORD	(24)
#define FONT_CHR_HEIGHT		(2)		//フォント高さ2キャラ
#define MSGCOLOR_NAME		(GF_PRINTCOLOR_MAKE(1, 2, 0))	//FONT_SYSTEMなので背景抜き色指定

#define FRAME_OFS_X		(128)
#define RANK_OFS_X		(16)
#define ICON_OFS_X		(48)
#define ACT_DISP_OFS_Y		(16)

//フレームアクターを親としたときのフォントOAMの表示オフセット
#define FOAM_Y	(-16)

#define NAME_OFS_X		(-56)
#define NAME_OFS_Y		(-16)

#define RECORD_OFS_X	(-56)
#define RECORD_OFS_Y	(0)


//=============================================================================
/**
 *								構造体定義
 */
//=============================================================================
typedef struct TAG_FONT_OAM_tag
{
	FONTOAM_OBJ_PTR ObjPtr;
	CHAR_MANAGER_ALLOCDATA Data;
}TAG_FONT_OAM;

typedef struct FOAM_SETUP_DATA_tag
{
	//BMP
	GF_BGL_BMPWIN BmpWin;
	//フォント
	FONTOAM_OAM_DATA_PTR OamDataPtr;
	//データサイズ
	int Size;
}FOAM_SETUP_DATA;

typedef struct TAG_ACT_tag
{
	CLACT_WORK_PTR Frame;	//フレーム
	CLACT_WORK_PTR Rank;	//順位
	CLACT_WORK_PTR Ribbon;	//アイコン（リボン）
	CLACT_WORK_PTR Trainer;

	TAG_FONT_OAM Name;	//トレーナー名orポケモン名
	TAG_FONT_OAM Record;	//成績
}TAG_ACT;

typedef struct RESULT_TAG_tag
{
	TAG_ACT	TagAct;	//アクター群
	BOOL Valid;	//有効フラグ
	int TagNo;	//タグナンバー　0〜4
	int X;
	int Y;
	int NetID;
	u16 Rank;
}RESULT_TAG;

typedef struct RTAG_CNT_tag
{
	int HeapID;					//ヒープID
	PKTHLN_PTR PkthlnPtr;		//ポケスロンポインタ	これで、マイステータスとかにアクセスする
	GF_BGL_INI *bgl;
	PKTHLN_CLACT_CNT_PTR ActCntPtr;	//アクターコントローラ
	FONTOAM_SYS_PTR		FontOamSys;	///<FontOamマネージャ
	RESULT_TAG	Tag[TAG_MAX];		//タグ
	// セルアクター関連
	CLACT_SET_PTR	ClActSet;				// セルアクターセット
	CLACT_U_EASYRENDER_DATA RendData;			// 簡易レンダーデータ
	CLACT_U_RES_MANAGER_PTR ResMan[CLACT_U_RES_MAX];	// リソースマネージャ
	CLACT_U_RES_OBJ_PTR ResObjTbl[CLACT_U_RES_MAX];	// リソースオブジェテーブル
	CLACT_HEADER ClActHeader;

	//フォントOAM
	FOAM_SETUP_DATA	FntOamSetupData[FONT_OAM_TYPE_NUM];		//配列インデックスは「SETUP_DATA_ID_〜」を使用

	BOOL RibbonValid;	// リボン表示するか？
	int MakePoint;		// タグ作成ポイント(インデックス)
}RTAG_CNT;

typedef enum{
	ANM_RIBBON = 18,
	ANM_FRAME = 17,
	ANM_RANK = 5,
	ANM_ICON_BASE = 0,
///	ANM_NAME,
///	ANM_RECODE,
}ANM_CHG;

enum {
	SETUP_DATA_ID_NAME = 0,
	SETUP_DATA_ID_RECORD,
};

//=============================================================================
/**
 *							プロトタイプ宣言
 */
//=============================================================================
// -- prototype --
static void InitCellActor(RTAG_CNT_PTR cnt_ptr);
static void MakeCellActorHeader(RTAG_CNT_PTR cnt_ptr);
static void MakeCLACT_ADD(CLACT_ADD *add, RTAG_CNT_PTR cnt_ptr, CLACT_HEADER *header, int param);
static CLACT_WORK_PTR MakeActor(CLACT_ADD *inAdd, const ANM_CHG inAnmChg, const u32 inPri);
static void MakeTagAct(RTAG_CNT_PTR cnt_ptr, const u8 inIdx, TAG_ACT *outTagAct);
static void MakeTrName(RTAG_CNT_PTR cnt_ptr, const int inNetID, RESULT_TAG *outTag);
static void MakeRecord(RTAG_CNT_PTR cnt_ptr, const STRBUF *inRecord, RESULT_TAG *outTag);
static void RefInfo(RESULT_TAG *ioTag);
static void SetTagVisible(const BOOL inIconVisible, const BOOL inFlg, TAG_ACT *outTagAct);
static void SetTagPosition(const int inX, const int inY, TAG_ACT *outTagAct);
static void MoveTagPosition(const int inX, const int inY, TAG_ACT *outTagAct);

static void MakeFontOam(RTAG_CNT_PTR cnt_ptr, FOAM_SETUP_DATA *inData,
		const STRBUF *str, const int inXOfs, const int inX, const int inY,
		CLACT_WORK_PTR parent, TAG_FONT_OAM *outFontOam);
static void SetupFontOAMDataAll(RTAG_CNT_PTR cnt_ptr);
static void DeleteFontOam(TAG_FONT_OAM *outFontOam);


//=============================================================================
/**
 *								外部公開関数
 */
//=============================================================================
//----------------------------------------------------------------------------
/**
 *	@brief	タグコントローラ初期化
 *
 *	@param	inHeapID			ヒープID
 *	@param	*bgl				BGL
 *	@param	pkthln_ptr			ポケスロンポインタ
 *
 *	@return RTAG_CNT_PTR		タグコントローラポインタ
 */
//-----------------------------------------------------------------------------
RTAG_CNT_PTR RTAG_Init(const int inHeapID, GF_BGL_INI *bgl, PKTHLN_PTR pkthln_ptr)
{
	int i;
	RTAG_CNT_PTR cnt_ptr;
	cnt_ptr = sys_AllocMemory(inHeapID, sizeof(RTAG_CNT));
	//メモリクリア
	MI_CpuClear8( cnt_ptr, sizeof(RTAG_CNT));
	cnt_ptr->HeapID = inHeapID;
	//フォントOAMマネージャ作成
	cnt_ptr->FontOamSys = FONTOAM_SysInit(TAG_FONT_OAM_MAX, inHeapID);
	//BGLポインタセット
	cnt_ptr->bgl = bgl;
	//ポケスロンポインタセット（楽するために入れちゃいました）
	cnt_ptr->PkthlnPtr = pkthln_ptr;

	//タグナンバーを振る
	for(i=0;i<TAG_MAX;i++){
		cnt_ptr->Tag[i].TagNo = i;
	}

	return cnt_ptr;
}

//----------------------------------------------------------------------------
/**
 *	@brief	タグコントローラ解放
 *
 *	@param	cnt_ptr	コントローラポインタ
 *
 *	@return	none
 */
//-----------------------------------------------------------------------------
void RTAG_End(RTAG_CNT_PTR cnt_ptr)
{
	int i;
	//アクター・フォントOAM解放
	for (i=0;i<TAG_MAX;i++){
		DeleteFontOam(&cnt_ptr->Tag[i].TagAct.Name);
		DeleteFontOam(&cnt_ptr->Tag[i].TagAct.Record);
		CLACT_Delete(cnt_ptr->Tag[i].TagAct.Frame);
		CLACT_Delete(cnt_ptr->Tag[i].TagAct.Rank);
		CLACT_Delete(cnt_ptr->Tag[i].TagAct.Ribbon);
		CLACT_Delete(cnt_ptr->Tag[i].TagAct.Trainer);
	}

	for(i=0;i<FONT_OAM_TYPE_NUM;i++){
		FOAM_SETUP_DATA *data = &cnt_ptr->FntOamSetupData[i];
		FONTOAM_OAMDATA_Free( data->OamDataPtr );
		GF_BGL_BmpWinDel( &data->BmpWin );
	}

	//フォントOAMマネージャ破棄
	FONTOAM_SysDelete( cnt_ptr->FontOamSys );

	// キャラ転送マネージャー破棄
	CLACT_U_CharManagerDelete(cnt_ptr->ResObjTbl[CLACT_U_CHAR_RES]);
	// パレット転送マネージャー破棄
	CLACT_U_PlttManagerDelete(cnt_ptr->ResObjTbl[CLACT_U_PLTT_RES]);

	// キャラ・パレット・セル・セルアニメのリソースマネージャー破棄
	for(i=0;i<CLACT_U_RES_MAX;i++){
		CLACT_U_ResManagerDelete(cnt_ptr->ResMan[i]);
	}

	// セルアクターセット破棄
	CLACT_DestSet(cnt_ptr->ClActSet);

	sys_FreeMemoryEz(cnt_ptr);
}

//----------------------------------------------------------------------------
/**
 *	@brief	描画関数
 *
 *	@param	cnt_ptr		コントローラポインタ
 *
 *	@return	none
 */
//-----------------------------------------------------------------------------
void RTAG_Draw(RTAG_CNT_PTR cnt_ptr)
{
	CLACT_Draw( cnt_ptr->ClActSet );
}

//----------------------------------------------------------------------------
/**
 *	@brief	セットアップ
 *
 *	@param	cnt_ptr			コントローラポインタ
 *	@param	inRibbonValid		アイコン有無
 *
 *	@return none
 */
//-----------------------------------------------------------------------------
void RTAG_Setup(RTAG_CNT_PTR cnt_ptr, const BOOL inRibbonValid)
{
	int i;

	//アクターセットアップ
	InitCellActor(cnt_ptr);
	MakeCellActorHeader(cnt_ptr);
	//タグアクター作成
	for(i=0;i<TAG_MAX;i++){
		MakeTagAct(cnt_ptr, i, &cnt_ptr->Tag[i].TagAct);
	}
	//フォントOAM
	SetupFontOAMDataAll(cnt_ptr);

	//画面幅設定	上下画面をまたがないので、少し間を空ける
	CLACT_U_SetSubSurfaceMatrix( &cnt_ptr->RendData, 0, (SUB_DISP_OFS*FX32_ONE) );
	CLACT_U_SetMainSurfaceMatrix( &cnt_ptr->RendData, 0, 0 );
}

//-------------------------------------------------------------------------
//タグ操作

//------------------------------------------------------------------
/**
 * @brief	指定タグを作成する
 * @param	cnt_ptr		管理ポインタ
 * @param	inX			作成X座標
 * @param	inY			作成Y座標
 * @param	inResult	結果データポインタ
 * @return	NONE
 */
//------------------------------------------------------------------
RTAG_PTR RTAG_MakeTag(	RTAG_CNT_PTR cnt_ptr,
					const int inX, const int inY,
					const RESULT_DATA *inResult	)
{
	RTAG_PTR	tag;
	COMMON_PLAYER_DATA* cmn_data;
	BOOL		b_npc;

	//現在追加位置のタグを作成
	tag = &(cnt_ptr->Tag[cnt_ptr->MakePoint]);
	if (tag->Valid){//使用中ならアサート
		GF_ASSERT(0);
	}

	HOSAKA_PRINT("netID:%d \n", tag->NetID);

	cmn_data = PTFrame_GetCmnPlayerDataPtrByID( cnt_ptr->PkthlnPtr, inResult->NetID );
	b_npc = (cmn_data->PersonCode > 0);

	//位置セット
	tag->X = inX;
	tag->Y = inY;
	//ネットIDセット
	tag->NetID = inResult->NetID;
	//順位セット
	tag->Rank = inResult->Rank;

	//成績セット
	MakeRecord(cnt_ptr, inResult->Record, tag);
	//トレーナー名
	MakeTrName(cnt_ptr, inResult->NetID, tag);

	// 一位の場合リボンを表示
	cnt_ptr->RibbonValid = ( tag->Rank == 0 );

	GF_ASSERT( tag->NetID < 4 );

	if( b_npc )
	{
		int obj_idx;
		int tex_idx;

		obj_idx = PTFrame_GetNpcObjCode( cmn_data->PersonCode );
		tex_idx = PTConv_NpcObjCode( obj_idx );

		// NPCの正面絵を転送
		CLACT_MapModelTrans( tag->TagAct.Trainer, tex_idx, TEX_ASEQ_NPC_FRONT, cnt_ptr->HeapID );
	}
	else
	{
		// 主人公の正面絵を転送
		CLACT_HeroTrans( tag->TagAct.Trainer, cnt_ptr->PkthlnPtr, tag->NetID, TEX_ASEQ_HERO_FRONT );
	}

	//アクター・フォントOAMの位置や色等を反映
	RefInfo(tag);
	//タグ表示
	SetTagVisible(cnt_ptr->RibbonValid, TRUE, &tag->TagAct);
	//使用状況ON
	tag->Valid = TRUE;
	//タグ作成ポイント更新
	cnt_ptr->MakePoint = (cnt_ptr->MakePoint+1)%TAG_MAX;

	return tag;
}

//----------------------------------------------------------------------------
/**
 *	@brief	タグのクリア
 *
 *	@param	tag_ptr 	クリアするタグポインタ
 *
 *	@return	none
 */
//-----------------------------------------------------------------------------
void RTAG_ClearTag( RTAG_PTR tag_ptr )
{
	if (!tag_ptr->Valid){//使用中でないならアサート
		GF_ASSERT(0);
	}
	//使用状況OFF
	tag_ptr->Valid = FALSE;
	//フォントOAMを破棄
	DeleteFontOam( &tag_ptr->TagAct.Name );
	DeleteFontOam( &tag_ptr->TagAct.Record );
}

//------------------------------------------------------------------
/**
 * @brief	指定タグの位置取得
 * @param	tag_ptr		タグポインタ
 * @param	outX		X座標
 * @param	outY		Y座標
 * @return	NONE
 */
//------------------------------------------------------------------
void RTAG_GetTagPos(RTAG_PTR tag_ptr, int *outX, int *outY)
{
	(*outX) = tag_ptr->X;
	(*outY) = tag_ptr->Y;
}

//------------------------------------------------------------------
/**
 * @brief	指定タグの位置セット
 * @param	tag_ptr		タグポインタ
 * @param	inX			X座標
 * @param	inY			Y座標
 * @return	NONE
 */
//------------------------------------------------------------------
void RTAG_SetTagPos(RTAG_PTR tag_ptr, const int inX, const int inY)
{
	tag_ptr->X = inX;
	tag_ptr->Y = inY;
	SetTagPosition(inX, inY, &tag_ptr->TagAct);
}

//------------------------------------------------------------------
/**
 * @brief	指定タグの移動
 * @param	tag_ptr		タグポインタ
 * @param	inX			X移動値
 * @param	inY			Y移動値
 * @return	NONE
 */
//------------------------------------------------------------------
void RTAG_MoveTag(RTAG_PTR tag_ptr, const int inX, const int inY)
{
	tag_ptr->X += inX;
	tag_ptr->Y += inY;
	MoveTagPosition( inX, inY, &tag_ptr->TagAct );
}

//-----------------------------------------------------------------------------
/**
 *	@brief	ランクを取得
 *
 *	@param	tag_ptr
 *
 *	@retval
 */
//-----------------------------------------------------------------------------
u16 RTAG_GetRank(RTAG_PTR tag_ptr)
{
	return tag_ptr->Rank;
}

int RTAG_GetTagNo(RTAG_PTR tag_ptr)
{
	return tag_ptr->TagNo;
}

//=============================================================================
/**
 *								static関数
 */
//=============================================================================
//------------------------------------------------------------------
/**
 * @brief	セルアクターの初期化
 * @param	cnt_ptr		管理ポインタ
 * @return	NONE
 */
//------------------------------------------------------------------
static void InitCellActor(RTAG_CNT_PTR cnt_ptr)
{
	int i;
	// セルアクター初期化
	cnt_ptr->ClActSet = CLACT_U_SetEasyInit( ACT_MAX, &cnt_ptr->RendData, cnt_ptr->HeapID);

	//リソースマネージャー初期化
	for(i=0;i<CLACT_U_RES_MAX;i++){	//リソースマネージャー作成
		cnt_ptr->ResMan[i] = CLACT_U_ResManagerInit(1, i, cnt_ptr->HeapID);
	}

	//---------下画面用-------------------
	//chara読み込み
	cnt_ptr->ResObjTbl[CLACT_U_CHAR_RES] =
		CLACT_U_ResManagerResAddArcChar(cnt_ptr->ResMan[CLACT_U_CHAR_RES],
					    ARC_PKTHEV_RESULT, NARC_pkthev_rslt_tag_NCGR,
					    FALSE, RES_CODE_RESULT, NNS_G2D_VRAM_TYPE_2DMAIN, cnt_ptr->HeapID);

	//pal読み込み
	cnt_ptr->ResObjTbl[CLACT_U_PLTT_RES] =
		CLACT_U_ResManagerResAddArcPltt(cnt_ptr->ResMan[CLACT_U_PLTT_RES],
					    ARC_PKTHEV_RESULT, NARC_pkthev_rslt_tag_NCLR,
					    FALSE, RES_CODE_RESULT, NNS_G2D_VRAM_TYPE_2DMAIN, TAG_PALETTE_NUM, cnt_ptr->HeapID);

	//cell読み込み
	cnt_ptr->ResObjTbl[CLACT_U_CELL_RES] =
		CLACT_U_ResManagerResAddArcKindCell(cnt_ptr->ResMan[CLACT_U_CELL_RES],
						ARC_PKTHEV_RESULT, NARC_pkthev_rslt_tag_NCER,
						FALSE, RES_CODE_RESULT, CLACT_U_CELL_RES, cnt_ptr->HeapID);

	//同じ関数でanim読み込み
	cnt_ptr->ResObjTbl[CLACT_U_CELLANM_RES] =
		CLACT_U_ResManagerResAddArcKindCell(cnt_ptr->ResMan[CLACT_U_CELLANM_RES],
						ARC_PKTHEV_RESULT, NARC_pkthev_rslt_tag_NANR,
						FALSE, RES_CODE_RESULT, CLACT_U_CELLANM_RES, cnt_ptr->HeapID);
	// Chara転送
	CLACT_U_CharManagerSetAreaCont( cnt_ptr->ResObjTbl[CLACT_U_CHAR_RES] );
	// パレット転送
	CLACT_U_PlttManagerSet( cnt_ptr->ResObjTbl[CLACT_U_PLTT_RES] );

}

//------------------------------------------------------------------
/**
 * @brief	セルアクターヘッダの作成
 * @param	cnt_ptr		管理ポインタ
 * @return	NONE
 */
//------------------------------------------------------------------
static void MakeCellActorHeader(RTAG_CNT_PTR cnt_ptr)
{
	// セルアクターヘッダ作成
	CLACT_U_MakeHeader(	&cnt_ptr->ClActHeader,
						RES_CODE_RESULT, RES_CODE_RESULT, RES_CODE_RESULT, RES_CODE_RESULT,
						CLACT_U_HEADER_DATA_NONE, CLACT_U_HEADER_DATA_NONE,
			     0, 0,
			     cnt_ptr->ResMan[CLACT_U_CHAR_RES],
				 cnt_ptr->ResMan[CLACT_U_PLTT_RES],
			     cnt_ptr->ResMan[CLACT_U_CELL_RES],
				 cnt_ptr->ResMan[CLACT_U_CELLANM_RES],
			     NULL,NULL);
}

//------------------------------------------------------------------
/**
 * @brief	CLACT_ADDの雛形を作成
 * @param	add		セルアクターADD構造体へのポインタ
 * @param	ptr		管理ポインタ
 * @param	header	アクターヘッダー
 * @param	param	描画エリア
 * @return	NONE
 */
//------------------------------------------------------------------
static void MakeCLACT_ADD(CLACT_ADD *add, RTAG_CNT_PTR cnt_ptr, CLACT_HEADER *header, int param)
{
  add->ClActSet		= cnt_ptr->ClActSet;
  add->ClActHeader	= &cnt_ptr->ClActHeader;
  add->mat.x		= 0;
  add->mat.y		= 0;
  add->mat.z		= 0;
  add->sca.x		= FX32_ONE;
  add->sca.y		= FX32_ONE;
  add->sca.z	= FX32_ONE;
  add->rot		= 0;
  add->pri		= TAG_PRI_TRAINER;
  add->DrawArea		= param;
  add->heap		= cnt_ptr->HeapID;
}

//------------------------------------------------------------------
/**
 * @brief	アクター作成
 * @param	cnt_ptr		管理ポインタ
 * @return	NONE
 */
//------------------------------------------------------------------
static CLACT_WORK_PTR MakeActor(CLACT_ADD *inAdd, const ANM_CHG inAnmChg, const u32 inPri)
{
	CLACT_WORK_PTR act_ptr;
	act_ptr = CLACT_Add(inAdd);
	CLACT_SetAnmFlag(act_ptr, 1);
	CLACT_AnmChg(act_ptr, inAnmChg);
	CLACT_SetDrawFlag(act_ptr, 0);	//非表示
	CLACT_DrawPriorityChg( act_ptr, inPri );
	return act_ptr;
}

//------------------------------------------------------------------
/**
 * @brief	タグアクター作成
 * @param	cnt_ptr		管理ポインタ
 * @param	outTagAct	タグアクターポインタ
 * @return	NONE
 */
//------------------------------------------------------------------
static void MakeTagAct(RTAG_CNT_PTR cnt_ptr, const u8 inIdx, TAG_ACT *outTagAct)
{
	CLACT_ADD add;
	MakeCLACT_ADD(&add, cnt_ptr, &cnt_ptr->ClActHeader, NNS_G2D_VRAM_TYPE_2DMAIN);

	//フレーム
	outTagAct->Frame = MakeActor(&add, ANM_FRAME, TAG_PRI_FRAME);
	//順位
	outTagAct->Rank = MakeActor(&add, ANM_RANK, TAG_PRI_RANK);
	//リボン
	outTagAct->Ribbon = MakeActor(&add, ANM_RIBBON, TAG_PRI_RIBBON);
	//トレーナーアイコン
	outTagAct->Trainer = MakeActor(&add, ANM_ICON_BASE, TAG_PRI_TRAINER);

	// トレーナーアイコンの参照先をずらしておく
	{
		u32 vram;
		CLACT_WORK_PTR act = outTagAct->Trainer;
		NNS_G2D_VRAM_TYPE type = CLACT_VramTypeGet( act );
		NNSG2dImageProxy* img = CLACT_ImageProxyGet( act );
		NNSG2dImagePaletteProxy* pal = CLACT_PaletteProxyGet( act );

		vram = NNS_G2dGetImageLocation( img, type );
		vram += 4*4*0x20 * inIdx;
		NNS_G2dInitImageProxy( img );
		NNS_G2dSetImageLocation( img, type, vram );

		vram = NNS_G2dGetImagePaletteLocation( pal, type );
		vram += ( TRAINER_PAL_OFS + inIdx ) * 0x20;
		NNS_G2dInitImagePaletteProxy( pal );
		NNS_G2dSetImagePaletteLocation( pal, type, vram );

		CLACT_ImageProxySet( act, img );
		CLACT_PaletteProxySet( act, pal );
		CLACT_PaletteOffsetChg( act, inIdx );
	}

}

//----------------------------------------------------------------------------
/**
 *	@brief	トレーナー名セット
 *
 *	@param	cnt_ptr			コントローラポインタ
 *	@param	inNetID			ネットID
 *	@param	*outTag			格納タグポインタ
 *
 *	@return none
 */
//-----------------------------------------------------------------------------
static void MakeTrName(RTAG_CNT_PTR cnt_ptr, const int inNetID, RESULT_TAG *outTag)
{
	STRBUF *name_buf;
	//マイステータスにアクセスして名前取得
	name_buf = MyStatus_CreateNameString(
			PTFrame_GetMyStatus(cnt_ptr->PkthlnPtr, inNetID),
			cnt_ptr->HeapID);
	MakeFontOam(cnt_ptr, &cnt_ptr->FntOamSetupData[SETUP_DATA_ID_NAME],
			name_buf, 0, NAME_OFS_X,NAME_OFS_Y, outTag->TagAct.Frame, &outTag->TagAct.Name);
	STRBUF_Delete(name_buf);
}

//----------------------------------------------------------------------------
/**
 *	@brief	成績セット
 *
 *	@param	cnt_ptr			コントローラポインタ
 *	@param	*inRecord		成績文字列バッファ
 *	@param	*outTag			格納タグポインタ
 *
 *	@return	none
 */
//-----------------------------------------------------------------------------
static void MakeRecord(RTAG_CNT_PTR cnt_ptr, const STRBUF *inRecord, RESULT_TAG *outTag)
{
	MakeFontOam(cnt_ptr, &cnt_ptr->FntOamSetupData[SETUP_DATA_ID_RECORD],
			inRecord, 0, RECORD_OFS_X,RECORD_OFS_Y, outTag->TagAct.Frame, &outTag->TagAct.Record);
}

//----------------------------------------------------------------------------
/**
 *	@brief	アクター・フォントOAMの位置や色等を反映
 *
 *	@param	*ioTag		タグポインタ
 *
 *	@return	none
 */
//-----------------------------------------------------------------------------
static void RefInfo(RESULT_TAG *ioTag)
{
	//位置の決定
	SetTagPosition(ioTag->X, ioTag->Y, &ioTag->TagAct);
	//色や、数字の決定
	{
		//フレーム色
		CLACT_PaletteNoChg( ioTag->TagAct.Frame, FRAME_PAL_OFS+ioTag->NetID);
		//順位
		CLACT_AnmChg(ioTag->TagAct.Rank, RANK_ANM_OFS + ioTag->Rank);
	}
}

//----------------------------------------------------------------------------
/**
 *	@brief	タグ表示・非表示
 *
 *	@param	inIconVisible		アイコン有無
 *	@param	inFlg				表示・非表示フラグ
 *	@param	*outTagAct			タグアクタポインタ
 *
 *	@return none
 */
//-----------------------------------------------------------------------------
static void SetTagVisible(const BOOL inIconVisible, const BOOL inFlg, TAG_ACT *outTagAct)
{
	CLACT_SetDrawFlag( outTagAct->Frame, inFlg );
	CLACT_SetDrawFlag( outTagAct->Rank, inFlg );
	if (inIconVisible){
		CLACT_SetDrawFlag( outTagAct->Ribbon, inFlg );
	}

	FONTOAM_SetDrawFlag( outTagAct->Name.ObjPtr, inFlg );
	FONTOAM_SetDrawFlag( outTagAct->Record.ObjPtr, inFlg );
}

//----------------------------------------------------------------------------
/**
 *	@brief	タグの位置セット
 *
 *	@param	inX				X座標
 *	@param	inY				Y座標
 *	@param	*outTagAct		タグアクタポインタ
 *
 *	@return	none
 */
//-----------------------------------------------------------------------------
static void SetTagPosition(const int inX, const int inY, TAG_ACT *outTagAct)
{
	VecFx32 vec = {0,ACT_DISP_OFS_Y*FX32_ONE,0};
	vec.y += (inY*FX32_ONE);

	//フレーム
	vec.x = (inX + FRAME_OFS_X)*FX32_ONE;
	CLACT_SetMatrix( outTagAct->Frame, &vec );
	//順位
	vec.x = (inX + RANK_OFS_X)*FX32_ONE;
	CLACT_SetMatrix( outTagAct->Rank, &vec );
	//トレーナーアイコン
	vec.x = (inX + ICON_OFS_X)*FX32_ONE;
	CLACT_SetMatrix( outTagAct->Ribbon, &vec );
	//リボンアイコン
	vec.y -= ICON_DISP_OFS * FX32_ONE;
	CLACT_SetMatrix( outTagAct->Trainer, &vec );

	//フォントOAM
	FONTOAM_ReflectParentMat( outTagAct->Name.ObjPtr );
	FONTOAM_ReflectParentMat( outTagAct->Record.ObjPtr );

}

//----------------------------------------------------------------------------
/**
 *	@brief	タグの移動
 *
 *	@param	inX			X移動値
 *	@param	inY			Y移動値
 *	@param	*outTagAct	タグアクタポインタ
 *
 *	@return none
 */
//-----------------------------------------------------------------------------
static void MoveTagPosition(const int inX, const int inY, TAG_ACT *outTagAct)
{
	VecFx32 vec;
	const VecFx32* const_vec;
	//フレーム
	const_vec = CLACT_GetMatrix(outTagAct->Frame);
	vec = (*const_vec);
	vec.x += (inX*FX32_ONE);
	vec.y += (inY*FX32_ONE);
	CLACT_SetMatrix( outTagAct->Frame, &vec );
	//順位
	const_vec = CLACT_GetMatrix(outTagAct->Rank);
	vec = (*const_vec);
	vec.x += (inX*FX32_ONE);
	vec.y += (inY*FX32_ONE);
	CLACT_SetMatrix( outTagAct->Rank, &vec );
	//アイコン
	const_vec = CLACT_GetMatrix(outTagAct->Trainer);
	vec = (*const_vec);
	vec.x += (inX*FX32_ONE);
	vec.y += (inY*FX32_ONE);
	CLACT_SetMatrix( outTagAct->Trainer, &vec );
	CLACT_SetMatrix( outTagAct->Ribbon, &vec );

	//フォントOAM
	FONTOAM_ReflectParentMat( outTagAct->Name.ObjPtr );
	FONTOAM_ReflectParentMat( outTagAct->Record.ObjPtr );
}

//-------------------------------------------------------------------------
//フォントOAM関連

//----------------------------------------------------------------------------
/**
 *	@brief		フォントOAMセットアップ
 *
 *	@param	cnt_ptr		コントローラポインタ
 *	@param	*data		セットアップデータポインタ
 *	@param	inChrLen	フォントOAMの横幅（キャラ）
 *
 *	@return	none
 */
//-----------------------------------------------------------------------------
static void SetupFontOAMData(RTAG_CNT_PTR cnt_ptr, FOAM_SETUP_DATA *data, const int inChrLen)
{
	//BMP作成
	GF_BGL_BmpWinInit(&data->BmpWin);
	GF_BGL_BmpWinObjAdd(cnt_ptr->bgl, &data->BmpWin,
			inChrLen, FONT_CHR_HEIGHT, 0, 0);
	//OAMDATAを作成
	data->OamDataPtr = FONTOAM_OAMDATA_Make(&data->BmpWin, cnt_ptr->HeapID);
	data->Size = FONTOAM_OAMDATA_NeedCharSize(data->OamDataPtr, NNS_G2D_VRAM_TYPE_2DMAIN);
}

//----------------------------------------------------------------------------
/**
 *	@brief	タグ1つ分のフォントOAMセットアップ
 *
 *	@param	cnt_ptr		コントローラポインタ
 *
 *	@return	none
 */
//-----------------------------------------------------------------------------
static void SetupFontOAMDataAll(RTAG_CNT_PTR cnt_ptr)
{
	//名前
	SetupFontOAMData(cnt_ptr,
			&cnt_ptr->FntOamSetupData[SETUP_DATA_ID_NAME],
			FONT_CHR_LEN_NAME);
	//成績
	SetupFontOAMData(cnt_ptr,
			&cnt_ptr->FntOamSetupData[SETUP_DATA_ID_RECORD],
			FONT_CHR_LEN_RECORD);
}

//----------------------------------------------------------------------------
/**
 *	@brief フォントOAM作成
 *
 *	@param	cnt_ptr			コントローラポインタ
 *	@param	*inData			フォントOAMセットアップデータポインタ
 *	@param	*str			文字列バッファ
 *	@param	inXOfs			X表示オフセット
 *	@param	inX				X座標
 *	@param 	inY				Y座標
 *	@param	parent			親アクター
 *	@param	*outFontOam		フォントOAM格納バッファ
 *
 *	@return none
 */
//-----------------------------------------------------------------------------
static void MakeFontOam(RTAG_CNT_PTR cnt_ptr, FOAM_SETUP_DATA *inData,
		const STRBUF *str, const int inXOfs, const int inX, const int inY,
		CLACT_WORK_PTR parent, TAG_FONT_OAM *outFontOam)
{
	FONTOAM_INIT finit;
	CHAR_MANAGER_ALLOCDATA cma;
	FONTOAM_OBJ_PTR fontoam;

	//BMPクリーン
	GF_BGL_BmpWinObjDataFill( &inData->BmpWin, 0 );
	//文字列作成
	GF_STR_PrintExpand(&inData->BmpWin, FONT_SYSTEM, str, inXOfs, 0, MSG_NO_PUT, MSGCOLOR_NAME,
			PANEL_MSG_MARGIN, 0, NULL);

	CharVramAreaAlloc(inData->Size, CHARM_CONT_AREACONT, NNS_G2D_VRAM_TYPE_2DMAIN, &cma);	//オフセットモードでアロック

	finit.fontoam_sys = cnt_ptr->FontOamSys;
	finit.bmp = &inData->BmpWin;
	finit.clact_set = cnt_ptr->ClActSet;
	finit.pltt = CLACT_U_PlttManagerGetProxy( cnt_ptr->ResObjTbl[CLACT_U_PLTT_RES], NULL );
	finit.parent = parent;
	finit.char_ofs = cma.alloc_ofs;
	finit.x = inX;
	finit.y = inY;
	finit.bg_pri = 0;
	finit.soft_pri = TAG_PRI_FONT;
	finit.draw_area = NNS_G2D_VRAM_TYPE_2DMAIN;
	finit.heap = cnt_ptr->HeapID;

	fontoam = FONTOAM_Init(&finit);

	FONTOAM_SetPaletteNo(fontoam, FONTOAM_PAL_NO);
	outFontOam->ObjPtr = fontoam;
	outFontOam->Data = cma;
}

//----------------------------------------------------------------------------
/**
 *	@brief	フォントOAMの破棄
 *
 *	@param	*outFontOam		フォントOAM
 *
 *	@return none
 */
//-----------------------------------------------------------------------------
static void DeleteFontOam(TAG_FONT_OAM *outFontOam)
{
	if (outFontOam->ObjPtr != NULL){
		FONTOAM_OAMDATA_Delete(outFontOam->ObjPtr);
		CharVramAreaFree(&outFontOam->Data);
		outFontOam->ObjPtr = NULL;
	}
}
